查看原文
其他

Git: 重写提交历史

lazybios 日拱一卒 2020-08-20

改变最后一次提交

git commit --ammend

由于局部性原则,往往你刚刚修改的东西的变动需求最大,所以改变最后一次commit的信息应该是最常见的需求了,在终端使用上面命令会直接把你带到上次commit的备注编辑状态,可以直接进行修改即可达到修改历史的效果。

不过需要注意的是,因为这种修正会改变提交的 SHA-1 校验和。 所以如果你对已经推送到服务上的最后一次commit进行修改,服务器的记录信息和你本地的不一致,会导致你下次push时候出错,所以这种修改尽量控制在本地。

修改多个提交信息

git rebase -i HEAD~4

有时候你要改变历史的那个提交,不是当前版本的最后一次commit,这时候我们就要借助变基(rebase)命令,把我们带到现场。使用命令行交互进行修改(-i 即表示interactive),这里需要注意的是HEAD~4 ,将想要修改的最近一次提交的父commit作为参数传递给git rebase -i命令。

执行命令后,会将你带到下图界面:


根据提示就要修改的commit前的pick置换成edit后退出编辑器,git会给出下一步操作的提示:


依照提示分别执行图中的命令即可完成修改,不过需要指出的是与git commit --ammend一样,这样的修改都会导致 SHA-1 校验和发生变化,所不同的是git commit --ammend影响的只是最后一次commit的SHA-1值,而rebase则会将当次修改以及介于修改之间的commit的SHA-1都重新计算得到新值,这样势必会导致push失败,所以修改还需要谨慎操作。

压缩提交

git rebase -i HEAD~3

小步快跑的开发模式,应该会经常用到这个技巧。将多个小版本迭代压缩成一个完整的feature再合并到主分支。这样的git历史要更好看一些。具体做法是仍然需要rebase变基指令,与上面不同的是这次不是将pick修改成edit,而是将其修改为squash,将要合并的几个commit前的pick同时换掉,不过要保留一个pick,这样才能rebase成功。如下图中示例:


修改后保存退出会将你带到commit信息编辑处,将多余的备注删除或修改为你想要的备注信息再次保存,这样就完成了全部压缩过程。


-完-

参考引用


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存